#include "QCVModuleHandler.h"

QCVModuleHandler::QCVModuleHandler(QString filename)
{
	//setWindowFlags (Qt::CustomizeWindowHint);
	autoProcess=true;
	pluginLoader=NULL;
	clearToken();
	
	loaded=loadModule(filename);
	
	if(loaded)
	{
		this->filename=filename;
		this->setWhatsThis(moduleInterface->help(-2));
		this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowContextHelpButtonHint);
	}
}
////////////////////////////////////////////////////////////////////////////////
QCVModuleHandler::~QCVModuleHandler()
{
	emit isClosing(this);
	moduleInterface->free();
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::forceOutput(cv::Mat & m)
{
  emit output(m);
}
////////////////////////////////////////////////////////////////////////////////
int QCVModuleHandler::getNbInputs()
{
  if(moduleInterface)
  {
    return moduleInterface->nbInputs();
  }
  else
  {
    return 0;
  }
}
////////////////////////////////////////////////////////////////////////////////
bool QCVModuleHandler::loadModule(QString filename)
{
	if(pluginLoader!=NULL)
	{
		if(!pluginLoader->unload())
		{
			QMessageBox::critical(this,"Erreur",trUtf8("Impossible de désallouer le plugin: <b>")+filename+trUtf8("</b>"));
			return false;
		}
	}
	
	pluginLoader=new QPluginLoader(filename);
	if(pluginLoader!=NULL)
	{
		QObject *plugin=NULL;
		if(pluginLoader->isLoaded())
		{
			plugin=pluginLoader->instance();
			QCVModuleInterface * loadedmoduleInterface = qobject_cast<QCVModuleInterface *>(plugin);
			moduleInterface=loadedmoduleInterface->clone();
		}
		else
		{
			plugin=pluginLoader->instance();
			moduleInterface = qobject_cast<QCVModuleInterface *>(plugin);
		}
	}
	else
	{
		QMessageBox::critical(this,"Erreur",trUtf8("Impossible de charger/recharger le plugin: <b>")+filename+trUtf8("</b>"));
		return false;
	}
	
	if(moduleInterface!=NULL)
	{
	  moduleInterface->init(this);
	  this->setWidget(moduleInterface->widget());
	  setWindowTitle(moduleInterface->getName());
	}
	else
	{
		QMessageBox::critical(this,"Erreur",trUtf8("Impossible de charger/recharger le plugin: <b>")+filename+trUtf8("</b>"));
		return false;
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::input0(cv::Mat & m)
{
  token[0]=true;
  moduleInterface->setInput(0,m);
  if(isTokenFull())
  {
    emit output(moduleInterface->process());
  }
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::input1(cv::Mat & m)
{
  token[1]=true;
  moduleInterface->setInput(1,m);
  if(isTokenFull())
  {
    emit output(moduleInterface->process());
  }
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::input2(cv::Mat & m)
{
  token[2]=true;
  moduleInterface->setInput(2,m);
  if(isTokenFull())
  {
    emit output(moduleInterface->process());
  }
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::input3(cv::Mat & m)
{
  token[3]=true;
  moduleInterface->setInput(3,m);
  if(isTokenFull())
  {
    emit output(moduleInterface->process());
  }
}
////////////////////////////////////////////////////////////////////////////////
bool QCVModuleHandler::isTokenFull()
{
	if((token[0]+token[1]+token[2]+token[3])==moduleInterface->nbInputs())
	{
		clearToken();
	  return autoProcess;		
	}
	else
	{
	  return false;
	}
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::clearToken()
{
  token[0]=false;
  token[1]=false;
  token[2]=false;
  token[3]=false;
}  
////////////////////////////////////////////////////////////////////////////////
QString QCVModuleHandler::getFilename()
{
  return filename;
}
////////////////////////////////////////////////////////////////////////////////
QString QCVModuleHandler::help(int id)
{
  return moduleInterface->help(id);
}
////////////////////////////////////////////////////////////////////////////////
QString QCVModuleHandler::getParams()
{
	return moduleInterface->getParams();
}
////////////////////////////////////////////////////////////////////////////////
bool QCVModuleHandler::setParams(QString params)
{
	return moduleInterface->setParams(params);
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::adjust()
{
	adjustSize();
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::moveEvent(QMoveEvent * e)
{
	emit move();
	update();
}
/*
void QCVModuleHandler::focusInEvent(QFocusEvent * e)
{
	emit move();
	update();
}
void QCVModuleHandler::focusOutEvent(QFocusEvent * e)
{
	emit move();
	update();
}
void QCVModuleHandler::resizeEvent(QResizeEvent * e)
{
	emit move();
	update();
}*/
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::reload()
{
	QString params=moduleInterface->getParams();
	moduleInterface->free();
	loadModule(filename);
	moduleInterface->setParams(params);
}
////////////////////////////////////////////////////////////////////////////////
void QCVModuleHandler::setAutoProcess(bool autop)
{
	autoProcess=autop;
}
////////////////////////////////////////////////////////////////////////////////
bool QCVModuleHandler::isLoaded()
{
	return loaded;
}